/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

syntax = "proto3";

option java_multiple_files = true;
option java_package = "org.apache.skywalking.oap.server.configuration.service";

service ConfigurationService {
    rpc call (ConfigurationRequest) returns (ConfigurationResponse) {
    }

    rpc callGroup (ConfigurationRequest) returns (GroupConfigurationResponse) {
    }
}

message ConfigurationRequest {
    // Logic name of this cluster,
    // in case the remote configuration center implementation support
    // configuration management for multiple clusters.
    string clusterName = 1;
    // The config UUID response from the config server side.
    string uuid = 2;
}

message ConfigurationResponse {
    // Include all config items.
    // All config name should be not empty,
    // the name is composed by "module name"."provider name"."item name".
    // Each watcher implementor provides this, and it will be notified when the value changed.
    //
    // If the config center wants to set the value to NULL or empty,
    // must set the name with empty value explicitly.
    repeated Config configTable = 1;
    // UUID is literal string represents the content of the config table.
    // If config table is unchanged, then could response the same uuid, and config table is not required.
    string uuid = 2;
}

message GroupConfigurationResponse {
    // Include all groupConfig items.
    // All groupConfigTable.groupName should be not empty,
    // Each watcher implementor provides this, and it will be notified when the groupConfigTable changed.
    repeated GroupConfigItems groupConfigTable = 1;
    // UUID is literal string represents the content of the config table.
    // If groupConfigTable is unchanged, then could response the same uuid, and groupConfigTable is not required.
    string uuid = 2;
}

message GroupConfigItems {
    // The name is composed by "module name"."provider name"."groupName".
    string groupName = 1;
    repeated Config items = 2;
}

message Config {
    string name = 1;
    string value = 2;
}